iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 21
0

經過前一篇的繼承方式說明後,今天我們要來做另外一隻怪物-骨頭魚,那這隻怪物只會說明追蹤主角的功能,因為它和尖刺怪的追蹤方式有較大的不同,其他的功能都大致相同,只有些微的差異,所以就不再多做介紹了,那我們就開始進入到骨頭魚追蹤主角功能吧!

一開始一樣要在骨頭魚身上加元件,骨頭魚和尖刺怪一樣都需要Rigidbody和Collider,不同的地方是骨頭魚不需要和地板做碰撞,但是又不希望它像自由落體一樣墜落到地圖外,所以我們要將Rigidbody的Body Type設定為Kinematic,另外由於骨頭魚的外型比較接近長方形,因此選用BoxCollider,而且這個Collider的Is Trigger為false喔!
https://ithelp.ithome.com.tw/upload/images/20200914/20130414tVoEyooJxT.jpg

在進入到程式的之前,我先說明一下,尖刺怪和骨頭魚有些很不一樣的地方,尖刺怪的移動是取得Rigidbody元件並設定它的velocity值,但骨頭魚則是直接去設定transform.position值,而且尖刺怪在主角還未接近時都處在禁止的狀態,但骨頭魚會一直在水中游來游去,所以骨頭魚還有在腳本中多寫一個來回移動的程式。

那我們就開始寫程式囉,首先一樣是先設定變數,包括:

  • moveRange,怪物可以移動的範圍
  • posNow,目前移動相對中點(初始位置)的位置
  • centerPos,可以移動區域的中心點
  • moveSpeedtrackSpeed分別是來回移動的速度及追蹤中的移動速度
  • Track Settings,在尖刺怪有說明過,關於追蹤的變數設定

https://ithelp.ithome.com.tw/upload/images/20200914/201304149T1gosuZFg.jpg

設定完變數之後,我們要開始寫來回移動的功能,將這個功能放在MoveAround的函式裡面,如下圖。

  1. 首先要判斷怪物的狀態,如果怪物沒有在攻擊的狀態下才可以執行來回移動。
  2. 判斷posNow的範圍,若超出怪物可以移動的範圍就要往回走。
  • Math.Clamp是用來限制value的值在min和max之間,如下方程式,如果posNowX小於-moveRangeX,就會返回-moveRangeX,相反地,posNowX大於moveRangeX則返回moveRangeX。
  • 遊戲開始時骨頭魚是向右走,所以goRight = true,但如果怪物超出範圍時,就要將goRight設為false。
  1. 藉由goRight的值去做設定,調整怪物的圖片的面向,然後將速度乘上時間所得的位移存在posNowX。
  2. 最後是設定怪物transform的值,讓怪物能夠順利地移動。

https://ithelp.ithome.com.tw/upload/images/20200914/20130414ibEaSSpwfZ.jpg

再來是追蹤主角設定,那跟尖刺怪一樣要先寫一個FindPlayer的函式,這部分和尖刺怪一樣都是用Physics2D.OverlapCircle來尋找主角,在這邊就不多做介紹了。
https://ithelp.ithome.com.tw/upload/images/20200914/20130414ZQiSM017sG.jpg

接下來進入追蹤主角,我們需要寫一個Tracking函式

  1. 判斷三個條件是否成立,分別是目前的是有追蹤目標的、不在攻擊的狀態下、沒有正在冷卻,三者成立才可以進行追蹤。
  2. 判斷主角與怪物的距離,如果距離小於closeRange則會終止函式執行。
  3. 由於骨頭魚在水中游來游去,不單只會有X軸的變化,還會有Y軸的變化,所以我們一樣設定posNow的範圍,並利用Math.Lerp讓怪物去做線性移動,再來設定transform.postion的值。
  4. 設定怪物面向哪一邊,利用diff.x的正負值,判斷主角在怪物的哪一邊,再去設定怪物圖的面向。

https://ithelp.ithome.com.tw/upload/images/20200914/20130414HMwWASt7G1.jpg

除了上方的設定之外,因為骨頭魚的移動總不可能一直面向右邊或左邊,所以我們還要調整骨頭魚的角度,讓整體的追蹤更加自然。

  1. 藉由Mathf.Atan2來判斷怪物指向主角連成的線,與x軸正方向之間的角度。
  2. 由於一開始怪物的方向就是面向右邊,所以當face是正值的時候,就直接使用transform.eulerAngles進行怪物旋轉。
  3. 若是遇到怪物是面向左邊,我們已經將怪物的圖做旋轉了,所以這邊要特別去判斷角度的範圍,再將angle做些變化,這樣怪物才能夠正常的旋轉喔!

https://ithelp.ithome.com.tw/upload/images/20200914/20130414IzjEMh7y3E.jpg

接著就是在Update裡面去呼叫上方所寫的函式,當然要將所有的情況都考慮清楚才不會出現Bug喔,所以我在Update裡寫了很多的if else,判斷所有的狀態下應該進行什麼樣的動作,這地方要仔細想清楚,當然我也是經過玩家體驗之後發現的一些Bug,再去將原本沒考慮的情況加進去,相信多做練習就可以越來越熟練。
https://ithelp.ithome.com.tw/upload/images/20200914/20130414cFMQvPCvbo.jpg

最後我們的骨頭魚就可以正常移動及追蹤主角囉!


以上就是骨頭魚的追蹤主角功能介紹,那我們Blue Remedy的怪物程式說明就到這裡結束,明天開始就會進入到場景的介紹了喔!


上一篇
[Day20]怪物-繼承
下一篇
[Day22]場景-架設地形
系列文
Unity遊戲開發與實踐-BlueRemedy內容分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言